pacman::p_load(
tidyverse,
here,
RColorBrewer,
lubridate,
scales,
GGally,
stats,
corrplot,
mice,
VIM
)
flights_dt <- read_csv(here("clean_data/flights_clean.csv"))
Rows: 327346 Columns: 38
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (11): origin, origin_name, dest, dest_name, carrier, carrier_name, tailnum, manufacturer, model, engine, type
dbl (22): dep_delay, arr_delay, air_time, distance, flight, engines, seats, aircraft_age, lat, lon, alt, wind_di...
dttm (5): dep_time, sched_dep_time, arr_time, sched_arr_time, time_hour
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7", "#000000")
summary(flights_dt)
dep_time sched_dep_time dep_delay origin origin_name
Min. :2013-01-01 05:17:00 Min. :2013-01-01 05:15:00 Min. : -43.00 Length:327346 Length:327346
1st Qu.:2013-04-05 05:56:00 1st Qu.:2013-04-05 06:00:00 1st Qu.: -5.00 Class :character Class :character
Median :2013-07-04 09:52:30 Median :2013-07-04 09:54:30 Median : -2.00 Mode :character Mode :character
Mean :2013-07-03 18:10:05 Mean :2013-07-03 18:02:48 Mean : 12.56
3rd Qu.:2013-10-01 18:12:45 3rd Qu.:2013-10-01 18:14:45 3rd Qu.: 11.00
Max. :2013-12-31 23:56:00 Max. :2013-12-31 23:59:00 Max. :1301.00
arr_time sched_arr_time arr_delay dest
Min. :2013-01-01 00:03:00 Min. :2013-01-01 00:05:00 Min. : -86.000 Length:327346
1st Qu.:2013-04-05 01:03:00 1st Qu.:2013-04-05 03:43:30 1st Qu.: -17.000 Class :character
Median :2013-07-04 11:36:30 Median :2013-07-04 11:55:30 Median : -5.000 Mode :character
Mean :2013-07-03 19:41:02 Mean :2013-07-03 19:59:24 Mean : 6.895
3rd Qu.:2013-10-01 20:07:00 3rd Qu.:2013-10-01 20:20:30 3rd Qu.: 14.000
Max. :2014-01-01 00:00:00 Max. :2013-12-31 23:59:00 Max. :1272.000
dest_name air_time distance flight carrier carrier_name
Length:327346 Min. : 20.0 Min. : 80 Min. : 1 Length:327346 Length:327346
Class :character 1st Qu.: 82.0 1st Qu.: 509 1st Qu.: 544 Class :character Class :character
Mode :character Median :129.0 Median : 888 Median :1467 Mode :character Mode :character
Mean :150.7 Mean :1048 Mean :1943
3rd Qu.:192.0 3rd Qu.:1389 3rd Qu.:3412
Max. :695.0 Max. :4983 Max. :8500
tailnum manufacturer model engines seats engine
Length:327346 Length:327346 Length:327346 Min. :1.00 Min. : 2.0 Length:327346
Class :character Class :character Class :character 1st Qu.:2.00 1st Qu.: 55.0 Class :character
Mode :character Mode :character Mode :character Median :2.00 Median :149.0 Mode :character
Mean :1.99 Mean :137.5
3rd Qu.:2.00 3rd Qu.:189.0
Max. :4.00 Max. :450.0
NA's :48329 NA's :48329
aircraft_age lat lon alt time_hour wind_dir
Min. : 8.00 Min. :21.32 Min. :-157.92 Min. : 3.0 Min. :2013-01-01 10:00:00 Min. : 0.0
1st Qu.:15.00 1st Qu.:32.90 1st Qu.: -95.34 1st Qu.: 26.0 1st Qu.:2013-04-05 10:00:00 1st Qu.:130.0
Median :19.00 Median :36.08 Median : -83.99 Median : 433.0 Median :2013-07-04 13:00:00 Median :220.0
Mean :19.59 Mean :35.97 Mean : -89.61 Mean : 583.8 Mean :2013-07-03 21:56:45 Mean :201.9
3rd Qu.:22.00 3rd Qu.:41.41 3rd Qu.: -80.15 3rd Qu.: 748.0 3rd Qu.:2013-10-01 22:00:00 3rd Qu.:290.0
Max. :65.00 Max. :61.17 Max. : -68.83 Max. :6602.0 Max. :2014-01-01 04:00:00 Max. :360.0
NA's :53493 NA's :7537 NA's :7537 NA's :7537 NA's :9574
humid hour minute year type temp
Min. : 12.74 Min. : 5.00 Min. : 0.00 Min. :1956 Length:327346 Min. : 10.94
1st Qu.: 43.74 1st Qu.: 9.00 1st Qu.: 8.00 1st Qu.:1999 Class :character 1st Qu.: 42.08
Median : 57.22 Median :13.00 Median :29.00 Median :2002 Mode :character Median : 57.20
Mean : 59.21 Mean :13.14 Mean :26.23 Mean :2001 Mean : 57.01
3rd Qu.: 74.67 3rd Qu.:17.00 3rd Qu.:44.00 3rd Qu.:2006 3rd Qu.: 71.96
Max. :100.00 Max. :23.00 Max. :59.00 Max. :2013 Max. :100.04
NA's :1544 NA's :53493 NA's :1544
dewp wind_speed precip pressure visib
Min. :-9.94 Min. : 0.000 Min. :0.0000 Min. : 983.8 Min. : 0.00
1st Qu.:26.06 1st Qu.: 6.905 1st Qu.:0.0000 1st Qu.:1012.9 1st Qu.:10.00
Median :42.80 Median :10.357 Median :0.0000 Median :1017.6 Median :10.00
Mean :41.50 Mean :11.060 Mean :0.0042 Mean :1017.9 Mean : 9.29
3rd Qu.:57.92 3rd Qu.:14.960 3rd Qu.:0.0000 3rd Qu.:1022.9 3rd Qu.:10.00
Max. :78.08 Max. :42.579 Max. :1.2100 Max. :1042.1 Max. :10.00
NA's :1544 NA's :1605 NA's :1527 NA's :36142 NA's :1527
Which airport in our dataset has the highest number of departures?

What is the trend of delays over the year, how does it compare across the three airports?
flights_dt %>%
filter(dep_delay >= 15) %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = month, y = mean_delay, colour = origin) +
geom_line(alpha = 0.6) +
geom_point(alpha = 0.8) +
labs(
x = "month",
y = "mean departure delay (minutes)",
title = " Mean delay by month",
colour = "airport"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

Which months have the highest and lowest mean departure delays?
# highest mean departure delay by month
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
arrange(desc(mean_delay))
# lowest departure delay by month
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
arrange(mean_delay)
What is the number of delayed flights over the year?
flights_dt %>%
filter(dep_delay >= 15) %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(no_of_delays = n(), .groups = "drop") %>%
ggplot() +
aes(x = month, y = no_of_delays, colour = origin) +
geom_line(alpha = 0.6) +
geom_point(alpha = 0.8) +
labs(
x = "month",
y = "number of delays",
title = "Number of delayed flights by month",
colour = "airport"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

Which month has the highest number of delays?
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(no_of_delays = n(), .groups = "drop") %>%
arrange(desc(no_of_delays))
What were the weather conditions during these months?
flights_dt %>%
mutate(date = as.Date(dep_time, label = TRUE),
month = month(dep_time, label = TRUE)) %>%
filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
select(date, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>%
group_by(date) %>%
summarise(
mean_pressure = mean(pressure, na.rm = TRUE),
mean_precip = mean(precip, na.rm = TRUE),
mean_temp = mean(temp, na.rm = TRUE),
mean_wind_speed = mean(wind_speed, na.rm = TRUE),
mean_wind_dir = mean(wind_dir, na.rm = TRUE),
mean_dewp = mean(dewp, na.rm = TRUE),
mean_visib = mean(visib, na.rm = TRUE),
mean_humid = mean(humid, na.rm = TRUE)
) %>%
pivot_longer(
cols = mean_pressure:mean_humid,
names_to = "variable",
values_to = "value"
) %>%
ggplot() +
aes(x = date, y = value, colour = variable) +
geom_line() +
scale_colour_manual(values = cbPalette) +
theme_bw()
Warning: Removed 8 row(s) containing missing values (geom_path).

flights_dt %>%
mutate(date = as.Date(dep_time, label = TRUE),
month = month(dep_time, label = TRUE)) %>%
filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
select(date, dep_delay, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>%
group_by(date) %>%
summarise(
departure_delay = mean(dep_delay),
pressure = mean(pressure),
precipitation = mean(precip),
temperature = mean(temp),
wind_speed = mean(wind_speed),
wind_direction = mean(wind_dir),
dewpoint = mean(dewp),
visibility = mean(visib),
humidity = mean(humid)
) %>%
na.omit() %>%
kable(align = "c") %>%
kable_styling(full_width = FALSE) %>%
column_spec(1:10, color = "black")
| date |
departure_delay |
pressure |
precipitation |
temperature |
wind_speed |
wind_direction |
dewpoint |
visibility |
humidity |
| 2013-12-02 |
60.08537 |
1013.267 |
0.0000000 |
46.32317 |
1.684068 |
11.58537 |
33.83073 |
7.402439 |
62.29524 |
| 2013-12-03 |
46.37931 |
1013.555 |
0.0000000 |
48.27759 |
5.297556 |
176.55172 |
33.99241 |
8.275862 |
59.37724 |
| 2013-12-04 |
58.64286 |
1019.479 |
0.0000000 |
47.24857 |
3.074227 |
39.14286 |
39.51371 |
6.314286 |
74.70871 |
| 2013-12-11 |
50.72414 |
1024.549 |
0.0000000 |
29.61655 |
12.248532 |
234.48276 |
16.42483 |
10.000000 |
57.65954 |
| 2013-12-12 |
41.20000 |
1024.931 |
0.0000000 |
24.20825 |
11.234490 |
251.25000 |
6.60200 |
10.000000 |
46.63287 |
| 2013-12-13 |
48.45902 |
1023.211 |
0.0000000 |
31.33311 |
10.772055 |
247.21311 |
14.74656 |
10.000000 |
49.98475 |
| 2013-12-16 |
43.13000 |
1020.163 |
0.0000000 |
27.44420 |
11.116535 |
279.50000 |
9.73220 |
9.950000 |
46.96260 |
| 2013-12-18 |
41.73529 |
1019.113 |
0.0000000 |
31.42294 |
9.950862 |
252.54902 |
19.94529 |
9.950980 |
62.86186 |
| 2013-12-19 |
53.08904 |
1019.290 |
0.0000000 |
38.14096 |
5.777546 |
199.93151 |
26.13644 |
9.739726 |
62.29753 |
| 2013-12-20 |
56.01198 |
1016.354 |
0.0000000 |
45.38790 |
7.194098 |
207.42515 |
32.40527 |
9.952096 |
60.93689 |
| 2013-12-21 |
56.14516 |
1014.031 |
0.0004032 |
57.21452 |
7.081009 |
195.16129 |
48.57452 |
9.943548 |
73.58613 |
| 2013-12-24 |
41.00000 |
1021.422 |
0.0000000 |
36.45655 |
12.599057 |
317.75862 |
20.25966 |
10.000000 |
52.09621 |
| 2013-12-27 |
49.68468 |
1026.695 |
0.0000000 |
37.00757 |
8.159134 |
248.01802 |
19.18919 |
10.000000 |
48.95180 |
| 2013-12-28 |
36.03896 |
1020.871 |
0.0000000 |
45.39247 |
12.688470 |
228.83117 |
25.24182 |
10.000000 |
47.41364 |
flights_dt %>%
mutate(date = as.Date(dep_time, label = TRUE),
month = month(dep_time, label = TRUE)) %>%
filter(dep_delay >= 15 & origin == "EWR" & month == "Dec") %>%
select(date, dep_delay, month, pressure, precip, temp, wind_speed, wind_dir, dewp, visib, humid) %>%
group_by(date) %>%
summarise(
departure_delay = scale(dep_delay),
pressure = scale(pressure),
precipitation = scale(precip),
temperature = scale(temp),
wind_speed = scale(wind_speed),
wind_direction = scale(wind_dir),
dewpoint = scale(dewp),
visibility = scale(visib),
humidity = scale(humid)
) %>%
na.omit() %>%
pivot_longer(
cols = departure_delay:humidity,
names_to = "variable",
values_to = "value"
) %>%
ggplot() +
aes(x = date, y = value, colour = variable) +
geom_point(alpha = 0.8) +
scale_colour_manual(values = cbPalette) +
scale_x_date(labels = date_format("%d"), breaks = date_breaks("day")) +
labs(
colour = "",
title = "Weather variables December"
) +
theme_bw()
`summarise()` has grouped output by 'date'. You can override using the `.groups` argument.

What is the number of flights per month?
flights_dt %>%
mutate(month = month(sched_dep_time, label = TRUE)) %>%
group_by(month, origin) %>%
summarise(no_of_flights = n(), .groups = "drop") %>%
ggplot() +
aes(x = month, y = no_of_flights, fill = origin) +
geom_col(position = "dodge", alpha = 0.8) +
labs(
x = "month",
y = "number of departures",
title = "Departure numbers by month",
fill = "airport"
) +
scale_fill_manual(values = cbPalette) +
theme_bw()

Which carrier has the most departure delays?
flights_dt %>%
filter(dep_delay >= 15) %>%
group_by(carrier_name, origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
geom_col(alpha = 0.8) +
facet_wrap(~ origin) +
labs(
x = "carrier",
y = "mean delay (minutes)",
title = "Mean departure delay by carrier",
fill = "airport"
) +
theme_bw() +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
coord_flip()

Which carrier has the most arrival delays?
flights_dt %>%
filter(arr_delay >= 15) %>%
group_by(carrier_name, origin) %>%
summarise(mean_delay = mean(arr_delay), .groups = "drop") %>%
ggplot() +
aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
geom_col(alpha = 0.8) +
facet_wrap(~ origin) +
labs(
x = "carrier",
y = "mean delay (minutes)",
title = "Mean arrival delay by carrier",
fill = "airport"
) +
theme_bw() +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
coord_flip()

Which season has the highest number of departure delays?
flights_dt %>%
filter(dep_delay >= 15) %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
ggplot() +
aes(x = day, y = mean_delay, colour = origin) +
geom_point(alpha = 0.8) +
labs(
x = "date",
y = "mean delay (minutes)",
title = "Mean departure delay by month"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

Over the course of a day when is the largest average delay?
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
select(dep_delay, hour) %>%
group_by(hour) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
ggplot() +
aes(x = hour, y = mean_delay) +
geom_point(alpha = 0.8, colour = "#56B4E9") +
geom_smooth(se = FALSE, colour = "#E69F00") +
labs(
x = "hour",
y = "mean delay (minutes)",
title = "Mean departure delay by departure time"
) +
theme_bw() +
scale_x_continuous(limits = c(5, 23), breaks = seq(5, 23, by = 1))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

How does distance of an outbound flight affect departure delays?
flights_dt %>%
filter(origin == "EWR") %>%
ggplot() +
aes(x = distance) +
geom_histogram(bins = 50) +
theme_bw() +
labs(title = "Distribution of flight distance")

positions <- c("<500mi", "500-1000mi", "1000-1500mi", "1500-2000mi", "2000-2500mi", "2500-3000mi",
">3000mi")
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
mutate(distance = case_when(
distance <= 500 ~ "<500mi",
distance > 500 & distance <= 1000 ~ "500-1000mi",
distance > 1000 & distance <= 1500 ~ "1000-1500mi",
distance > 1500 & distance <= 2000 ~ "1500-2000mi",
distance > 2000 & distance <= 2500 ~ "2000-2500mi",
distance > 2500 & distance <= 3000 ~ "2500-3000mi",
distance > 3000 ~ ">3000mi"
)) %>%
group_by(distance) %>%
summarise(mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = distance, y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "distance (miles)",
y = "mean departure delay (minutes)",
title = "Departure delay by flight distance"
) +
scale_x_discrete(limits = positions) +
theme_bw()

Which day is the best day to travel from Newark Int.?
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
mutate(weekday = wday(sched_dep_time, label = TRUE)) %>%
group_by(weekday) %>%
summarise(mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = weekday, y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "weekday",
y = "mean departure delay (minutes)",
title = "Departure delay by weekday"
) +
theme_bw()

Which are the most popular destinations from Newark Int?
flights_dt %>%
filter(origin == "EWR") %>%
group_by(dest, dest_name) %>%
summarise(count = n(), .groups = "drop") %>%
arrange(desc(count)) %>%
head(10) %>%
ggplot() +
aes(x = reorder(dest_name, count), y = count) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "destination",
y = "number of flights per year",
title = "Destinations from Newark Int."
) +
theme_bw() +
coord_flip()

Which destinations suffer from the longest delays?
flights_dt %>%
drop_na(dest_name) %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(dest, dest_name) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(mean_delay)) %>%
head(10) %>%
ggplot() +
aes(x = reorder(dest_name, mean_delay), y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "destination",
y = "mean delay (minutes)",
title = "Destinations with longest delays"
) +
theme_bw() +
coord_flip()

Trend weather conditions against mean departure delays
flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_visibility = mean(visib, na.rm = TRUE),
mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = mean_visibility, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean visibility (miles)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by visibility"
) +
theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_wind_speed = mean(wind_speed, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_wind_speed, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean wind speed (mph)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by wind speed"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_wind_dir = mean(wind_dir, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_wind_dir, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean wind direction (degrees)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by wind direction"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_humidity = mean(humid, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_humidity, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean humidity (%)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by humidity"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_temp = mean(temp, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_temp, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean temperature (degf)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by temperature"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_dewpoint = mean(dewp, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_dewpoint, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean dewpoint (degF)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by dewpoint"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_precip = mean(precip, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_precip, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean precipitation (inches)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by precipitation"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay >= 15 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_pressure = mean(pressure, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_pressure, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean pressure (mbar)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by pressure"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CnBhY21hbjo6cF9sb2FkKAogIHRpZHl2ZXJzZSwKICBoZXJlLAogIFJDb2xvckJyZXdlciwKICBsdWJyaWRhdGUsCiAgc2NhbGVzLAogIEdHYWxseSwKICBzdGF0cywKICBjb3JycGxvdCwKICBsZWFwcywKICBnbG11bHRpLAogIGJyb29tLAogIHJwYXJ0LAogIHJwYXJ0LnBsb3QsCiAgbW9kZWxyLAogIHlhcmRzdGljaywKICBjYXJldCwKICByYW5nZXIsCiAga2FibGVFeHRyYQopCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0KZmxpZ2h0c19kdCA8LSByZWFkX2NzdihoZXJlKCJjbGVhbl9kYXRhL2ZsaWdodHNfY2xlYW4uY3N2IikpCgpjYlBhbGV0dGUgPC0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiLCAiIzAwOUU3MyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiI0Q1NUUwMCIsICIjQ0M3OUE3IiwgIiMwMDAwMDAiKQoKc3VtbWFyeShmbGlnaHRzX2R0KQpgYGAKCiMgV2hpY2ggYWlycG9ydCBpbiBvdXIgZGF0YXNldCBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZ3JvdXBfYnkob3JpZ2luKSAlPiUKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBvcmlnaW4sIGZpbGwgPSBvcmlnaW4pICsKICBnZW9tX2JhcihhbHBoYSA9IDAuOCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIGxhYnMoCiAgICB4ID0gImFpcnBvcnQiLAogICAgeSA9ICJkZXBhcnR1cmUgbnVtYmVycyIsCiAgICB0aXRsZSA9ICJEZXBhcnR1cmUgbnVtYmVycyBieSBhaXJwb3J0IgogICkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hhdCBpcyB0aGUgdHJlbmQgb2YgZGVsYXlzIG92ZXIgdGhlIHllYXIsIGhvdyBkb2VzIGl0IGNvbXBhcmUgYWNyb3NzIHRoZSB0aHJlZSBhaXJwb3J0cz8KCmBgYHtyLHdhcm5pbmc9RkFMU0V9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1vbnRoLCB5ID0gbWVhbl9kZWxheSwgY29sb3VyID0gb3JpZ2luKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC42KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIiBNZWFuIGRlbGF5IGJ5IG1vbnRoIiwKICAgIGNvbG91ciA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lX2J3KCkKYGBgCiMgV2hpY2ggbW9udGhzIGhhdmUgdGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KIyBoaWdoZXN0IG1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IG1vbnRoCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UoZGVzYyhtZWFuX2RlbGF5KSkKYGBgCgpgYGB7cn0KIyBsb3dlc3QgZGVwYXJ0dXJlIGRlbGF5IGJ5IG1vbnRoCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UobWVhbl9kZWxheSkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBkZWxheWVkIGZsaWdodHMgb3ZlciB0aGUgeWVhcj8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUpICU+JSAKICBncm91cF9ieShtb250aCA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJtb250aCIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2Uobm9fb2ZfZGVsYXlzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9kZWxheXMsIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fbGluZShhbHBoYSA9IDAuNikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJtb250aCIsCiAgICB5ID0gIm51bWJlciBvZiBkZWxheXMiLAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIGRlbGF5ZWQgZmxpZ2h0cyBieSBtb250aCIsCiAgICBjb2xvdXIgPSAiYWlycG9ydCIKICApICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IikpICsKICB0aGVtZV9idygpCmBgYAojIFdoaWNoIG1vbnRoIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KG1vbnRoID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgIm1vbnRoIiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9kZWxheXMgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBhcnJhbmdlKGRlc2Mobm9fb2ZfZGVsYXlzKSkKYGBgCgojIFdoYXQgd2VyZSB0aGUgd2VhdGhlciBjb25kaXRpb25zIGR1cmluZyB0aGVzZSBtb250aHM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRlcF90aW1lLCBsYWJlbCA9IFRSVUUpLAogICAgICAgICBtb250aCA9IG1vbnRoKGRlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIiAmIG1vbnRoID09ICJEZWMiKSAlPiUKICBzZWxlY3QoZGF0ZSwgbW9udGgsIHByZXNzdXJlLCBwcmVjaXAsIHRlbXAsIHdpbmRfc3BlZWQsIHdpbmRfZGlyLCBkZXdwLCB2aXNpYiwgaHVtaWQpICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgbWVhbl9wcmVzc3VyZSA9IG1lYW4ocHJlc3N1cmUsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX3ByZWNpcCA9IG1lYW4ocHJlY2lwLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl90ZW1wID0gbWVhbih0ZW1wLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl93aW5kX3NwZWVkID0gbWVhbih3aW5kX3NwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgbWVhbl93aW5kX2RpciA9IG1lYW4od2luZF9kaXIsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX2Rld3AgPSBtZWFuKGRld3AsIG5hLnJtID0gVFJVRSksCiAgICBtZWFuX3Zpc2liID0gbWVhbih2aXNpYiwgbmEucm0gPSBUUlVFKSwKICAgIG1lYW5faHVtaWQgPSBtZWFuKGh1bWlkLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IG1lYW5fcHJlc3N1cmU6bWVhbl9odW1pZCwKICAgIG5hbWVzX3RvID0gInZhcmlhYmxlIiwKICAgIHZhbHVlc190byA9ICJ2YWx1ZSIKICApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkYXRlLCB5ID0gdmFsdWUsIGNvbG91ciA9IHZhcmlhYmxlKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY2JQYWxldHRlKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGVwX3RpbWUsIGxhYmVsID0gVFJVRSksCiAgICAgICAgIG1vbnRoID0gbW9udGgoZGVwX3RpbWUsIGxhYmVsID0gVFJVRSkpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiICYgbW9udGggPT0gIkRlYyIpICU+JQogIHNlbGVjdChkYXRlLCBkZXBfZGVsYXksIG1vbnRoLCBwcmVzc3VyZSwgcHJlY2lwLCB0ZW1wLCB3aW5kX3NwZWVkLCB3aW5kX2RpciwgZGV3cCwgdmlzaWIsIGh1bWlkKSAlPiUgCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIAogIHN1bW1hcmlzZSgKICAgIGRlcGFydHVyZV9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwKICAgIHByZXNzdXJlID0gbWVhbihwcmVzc3VyZSksCiAgICBwcmVjaXBpdGF0aW9uID0gbWVhbihwcmVjaXApLAogICAgdGVtcGVyYXR1cmUgPSBtZWFuKHRlbXApLAogICAgd2luZF9zcGVlZCA9IG1lYW4od2luZF9zcGVlZCksCiAgICB3aW5kX2RpcmVjdGlvbiA9IG1lYW4od2luZF9kaXIpLAogICAgZGV3cG9pbnQgPSBtZWFuKGRld3ApLAogICAgdmlzaWJpbGl0eSA9IG1lYW4odmlzaWIpLAogICAgaHVtaWRpdHkgPSBtZWFuKGh1bWlkKQogICkgJT4lIAogIG5hLm9taXQoKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgCiAgY29sdW1uX3NwZWMoMToxMCwgY29sb3IgPSAiYmxhY2siKQpgYGAgIAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIG11dGF0ZShkYXRlID0gYXMuRGF0ZShkZXBfdGltZSwgbGFiZWwgPSBUUlVFKSwKICAgICAgICAgbW9udGggPSBtb250aChkZXBfdGltZSwgbGFiZWwgPSBUUlVFKSkgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIgJiBtb250aCA9PSAiRGVjIikgJT4lCiAgc2VsZWN0KGRhdGUsIGRlcF9kZWxheSwgbW9udGgsIHByZXNzdXJlLCBwcmVjaXAsIHRlbXAsIHdpbmRfc3BlZWQsIHdpbmRfZGlyLCBkZXdwLCB2aXNpYiwgaHVtaWQpICU+JSAKICBncm91cF9ieShkYXRlKSAlPiUgCiAgc3VtbWFyaXNlKAogICAgZGVwYXJ0dXJlX2RlbGF5ID0gc2NhbGUoZGVwX2RlbGF5KSwKICAgIHByZXNzdXJlID0gc2NhbGUocHJlc3N1cmUpLAogICAgcHJlY2lwaXRhdGlvbiA9IHNjYWxlKHByZWNpcCksCiAgICB0ZW1wZXJhdHVyZSA9IHNjYWxlKHRlbXApLAogICAgd2luZF9zcGVlZCA9IHNjYWxlKHdpbmRfc3BlZWQpLAogICAgd2luZF9kaXJlY3Rpb24gPSBzY2FsZSh3aW5kX2RpciksCiAgICBkZXdwb2ludCA9IHNjYWxlKGRld3ApLAogICAgdmlzaWJpbGl0eSA9IHNjYWxlKHZpc2liKSwKICAgIGh1bWlkaXR5ID0gc2NhbGUoaHVtaWQpCiAgKSAlPiUgCiAgbmEub21pdCgpICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gZGVwYXJ0dXJlX2RlbGF5Omh1bWlkaXR5LAogICAgbmFtZXNfdG8gPSAidmFyaWFibGUiLAogICAgdmFsdWVzX3RvID0gInZhbHVlIgogICkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRhdGUsIHkgPSB2YWx1ZSwgY29sb3VyID0gdmFyaWFibGUpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjYlBhbGV0dGUpICsKICBzY2FsZV94X2RhdGUobGFiZWxzID0gZGF0ZV9mb3JtYXQoIiVkIiksIGJyZWFrcyA9IGRhdGVfYnJlYWtzKCJkYXkiKSkgKwogIGxhYnMoCiAgICBjb2xvdXIgPSAiIiwKICAgIHRpdGxlID0gIldlYXRoZXIgdmFyaWFibGVzIERlY2VtYmVyIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIG11dGF0ZShtb250aCA9IG1vbnRoKHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkobW9udGgsIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9mbGlnaHRzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9mbGlnaHRzLCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibnVtYmVyIG9mIGRlcGFydHVyZXMiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIG51bWJlcnMgYnkgbW9udGgiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoaWNoIGNhcnJpZXIgaGFzIHRoZSBtb3N0IGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXJfbmFtZSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGNhcnJpZXJfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5LCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAwLjgpICsKICBmYWNldF93cmFwKH4gb3JpZ2luKSArCiAgbGFicygKICAgIHggPSAiY2FycmllciIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IGNhcnJpZXIiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgV2hpY2ggY2FycmllciBoYXMgdGhlIG1vc3QgYXJyaXZhbCBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGFycl9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGNhcnJpZXJfbmFtZSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGFycl9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGNhcnJpZXJfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5LCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2woYWxwaGEgPSAwLjgpICsKICBmYWNldF93cmFwKH4gb3JpZ2luKSArCiAgbGFicygKICAgIHggPSAiY2FycmllciIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gYXJyaXZhbCBkZWxheSBieSBjYXJyaWVyIiwKICAgIGZpbGwgPSAiYWlycG9ydCIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIFdoaWNoIHNlYXNvbiBoYXMgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSkgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRheSwgeSA9IG1lYW5fZGVsYXksIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkYXRlIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgbW9udGgiCiAgKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgT3ZlciB0aGUgY291cnNlIG9mIGEgZGF5IHdoZW4gaXMgdGhlIGxhcmdlc3QgYXZlcmFnZSBkZWxheT8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgc2VsZWN0KGRlcF9kZWxheSwgaG91cikgJT4lCiAgZ3JvdXBfYnkoaG91cikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBob3VyLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgsIGNvbG91ciA9ICIjNTZCNEU5IikgKwogIGdlb21fc21vb3RoKHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gImhvdXIiLAogICAgeSA9ICJtZWFuIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBkZXBhcnR1cmUgdGltZSIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyg1LCAyMyksIGJyZWFrcyA9IHNlcSg1LCAyMywgYnkgPSAxKSkKYGBgCiMgSG93IGRvZXMgZGlzdGFuY2Ugb2YgYW4gb3V0Ym91bmQgZmxpZ2h0IGFmZmVjdCBkZXBhcnR1cmUgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkaXN0YW5jZSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCkgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIGZsaWdodCBkaXN0YW5jZSIpCmBgYAoKYGBge3J9CnBvc2l0aW9ucyA8LSBjKCI8NTAwbWkiLCAiNTAwLTEwMDBtaSIsICIxMDAwLTE1MDBtaSIsICIxNTAwLTIwMDBtaSIsICIyMDAwLTI1MDBtaSIsICIyNTAwLTMwMDBtaSIsCiAgICAgICAgICAgICAgICI+MzAwMG1pIikKCmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBtdXRhdGUoZGlzdGFuY2UgPSBjYXNlX3doZW4oCiAgICBkaXN0YW5jZSA8PSA1MDAgfiAiPDUwMG1pIiwKICAgIGRpc3RhbmNlID4gNTAwICYgZGlzdGFuY2UgPD0gMTAwMCB+ICI1MDAtMTAwMG1pIiwKICAgIGRpc3RhbmNlID4gMTAwMCAmIGRpc3RhbmNlIDw9IDE1MDAgfiAiMTAwMC0xNTAwbWkiLAogICAgZGlzdGFuY2UgPiAxNTAwICYgZGlzdGFuY2UgPD0gMjAwMCB+ICIxNTAwLTIwMDBtaSIsCiAgICBkaXN0YW5jZSA+IDIwMDAgJiBkaXN0YW5jZSA8PSAyNTAwIH4gIjIwMDAtMjUwMG1pIiwKICAgIGRpc3RhbmNlID4gMjUwMCAmIGRpc3RhbmNlIDw9IDMwMDAgfiAiMjUwMC0zMDAwbWkiLAogICAgZGlzdGFuY2UgPiAzMDAwIH4gIj4zMDAwbWkiCiAgKSkgJT4lIAogIGdyb3VwX2J5KGRpc3RhbmNlKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBkaXN0YW5jZSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRpc3RhbmNlIChtaWxlcykiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIGRlbGF5IGJ5IGZsaWdodCBkaXN0YW5jZSIKICApICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IHBvc2l0aW9ucykgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoaWNoIGRheSBpcyB0aGUgYmVzdCBkYXkgdG8gdHJhdmVsIGZyb20gTmV3YXJrIEludC4/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSB3ZGF5KHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gd2Vla2RheSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIndlZWtkYXkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIGRlbGF5IGJ5IHdlZWtkYXkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hpY2ggYXJlIHRoZSBtb3N0IHBvcHVsYXIgZGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGVzdCwgZGVzdF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lIAogIGhlYWQoMTApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGRlc3RfbmFtZSwgY291bnQpLCB5ID0gY291bnQpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRlc3RpbmF0aW9uIiwKICAgIHkgPSAibnVtYmVyIG9mIGZsaWdodHMgcGVyIHllYXIiLAogICAgdGl0bGUgPSAiRGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludC4iCiAgKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBXaGljaCBkZXN0aW5hdGlvbnMgc3VmZmVyIGZyb20gdGhlIGxvbmdlc3QgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZHJvcF9uYShkZXN0X25hbWUpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGVzdCwgZGVzdF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGFycmFuZ2UoZGVzYyhtZWFuX2RlbGF5KSkgJT4lIAogIGhlYWQoMTApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGRlc3RfbmFtZSwgbWVhbl9kZWxheSksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9jb2woZmlsbCA9ICIjOTk5OTk5IiwgYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkZXN0aW5hdGlvbiIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIkRlc3RpbmF0aW9ucyB3aXRoIGxvbmdlc3QgZGVsYXlzIgogICkgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgVHJlbmQgd2VhdGhlciBjb25kaXRpb25zIGFnYWluc3QgbWVhbiBkZXBhcnR1cmUgZGVsYXlzCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fdmlzaWJpbGl0eSA9IG1lYW4odmlzaWIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3Zpc2liaWxpdHksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdmlzaWJpbGl0eSAobWlsZXMpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHZpc2liaWxpdHkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl93aW5kX3NwZWVkID0gbWVhbih3aW5kX3NwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl93aW5kX3NwZWVkLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHdpbmQgc3BlZWQgKG1waCkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgd2luZCBzcGVlZCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3dpbmRfZGlyID0gbWVhbih3aW5kX2RpciwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5fd2luZF9kaXIsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gd2luZCBkaXJlY3Rpb24gKGRlZ3JlZXMpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHdpbmQgZGlyZWN0aW9uIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9odW1pZGl0eSA9IG1lYW4oaHVtaWQsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX2h1bWlkaXR5LCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIGh1bWlkaXR5ICglKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBodW1pZGl0eSIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3RlbXAgPSBtZWFuKHRlbXAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3RlbXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdGVtcGVyYXR1cmUgKGRlZ2YpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHRlbXBlcmF0dXJlIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+PSAxNSAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGV3cG9pbnQgPSBtZWFuKGRld3AsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX2Rld3BvaW50LCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIGRld3BvaW50IChkZWdGKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBkZXdwb2ludCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPj0gMTUgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3ByZWNpcCA9IG1lYW4ocHJlY2lwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl9wcmVjaXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gcHJlY2lwaXRhdGlvbiAoaW5jaGVzKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVjaXBpdGF0aW9uIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID49IDE1ICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9wcmVzc3VyZSA9IG1lYW4ocHJlc3N1cmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3ByZXNzdXJlLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHByZXNzdXJlIChtYmFyKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVzc3VyZSIKICApICsKICB0aGVtZV9idygpCmBgYAoKCgo=